#include <vector>
#include <bitset>
#include <map>
#include <string>

using std::bitset;
using std::map;
using std::string;
using std::vector;

// 由于bitset本身没有operator<的定义，因此我们需要自定义
template <size_t sz>
struct bitset_comparer
{
	bool operator()(const bitset<sz> &b1, const bitset<sz> &b2) const
	{
		return b1.to_ulong() < b2.to_ulong();
	}
};
// 构造示例：map <bitset<16>, string, bitset_comparer<16>> MyMap10;

class LZW //利用LZW算法进行编码或解码
{
public:
	// 构造函数，初始化私有成员
	LZW();

	~LZW();

	// 输出字典
	void printDict();

	// 将字典写到文件里
	void outputDict(const char *);

	// 解码函数
	void decoding(const vector<bitset<16>> &);

	// 编码函数
	void encoding(const string &);
	vector<bitset<16>> &get_encode_result();

	// 获取解码结果
	string &get_decode_result();

	// 当字典满了之后需要重置编码表（清空）
	void dict_reset();

	// 判断字典满了
	bool dict_is_full();

	// 解码表重置
	void decode_table_reset(map<bitset<16>, string, bitset_comparer<16>> &table);

private:
	// 编码用的字典
	map<string, bitset<16>> dictionary;
	// 用来记录上次编解码的字符
	string last_code;
	// 新增加编码的值
	int code_value;
	// 字典最大容量512，满了之后清空
	int dic_size;
	// 用来保存编码结果
	vector<bitset<16>> encode_result;
	// 解码结果
	string decode_result;
};
